AWS ParallelCluster v3 カスタムブートストラップ用のS3バケット指定方法
AWS ParallelCluster v2 のコンフィグファイルを元にv3の設定していました。カスタムブートストラップ時に実行するスクリプト(postinstall.sh)の保存場所にS3バケットを引き続き指定できます。v3からコンフィグファイルの書き方が変わったため、そのまま移植はできませんでした。S3バケットの設定時に出くわしたエラーと、正しい指定方法を紹介します。
エラーメッセージ
{'Iam': {'S3Access': {0: {'BucketName': ['String does not match expected pattern.']}
{ "configurationValidationErrors": [ { "level": "ERROR", "type": "ConfigSchemaValidator", "message": "[('Scheduling', {'SlurmQueues': {0: {'Iam': {'S3Access': {0: {'BucketName': ['String does not match expected pattern.']}}}}, 1: {'Iam': {'S3Access': {0: {'BucketName': ['String does not match expected pattern.']}}}}, 2: {'Iam': {'S3Access': {0: {'BucketName': ['String does not match expected pattern.']}}}}, 3: {'Iam': {'S3Access': {0: {'BucketName': ['String does not match expected pattern.']}}}}}})]" } ], "message": "Invalid cluster configuration." }
結論
S3バケット名だけを指定すればよい。v2のときのままARN表記だとエラーになります。
S3Access: - BucketName: blog-parallelcluster-postinstall
コンフィグを移植してみた
AWS ParallelCluster v2 から v3への設定値の読み替えドキュメントが用意されています。以下を参考にコンフィグファイルを作成します。
S3バケット
以下のS3バケットのpostinstall.sh
を実行するためのS3バケット設定をしていきます。
失敗例
BucketName
でS3バケット指定方法はParallelCluster v2と同じようにARN表記で指定しました。
s3_read_resource = arn:aws:s3:::pcluster-postinsall/*
S3Access: - BucketName: arn:aws:s3:::blog-parallelcluster-postinstall*
クラスター作成時に以下のエラーで作成失敗。
{'Iam': {'S3Access': {0: {'BucketName': ['String does not match expected pattern.']}
ドキュメントにはbucket_name
と書いてあります。もしかしてシンプルにバケット名だけ入力すればよい?
成功例
BucketName
にそのままS3バケット名だけ指定しました。
S3Access: - BucketName: blog-parallelcluster-postinstall
設定の参考にコンフィグ全文記載します。
設定概要
- マルチキューモード設定
- スポット起動
- プレイスメントグループ有効
- EBS gp3指定
- AWS Systems Manager Seesion Manager接続用ポリシー追加
- 特定のS3バケットへ読み取り権限追加
- カスタムブートストラップ用のスクリプト実行設定
Region: ap-northeast-1 Image: Os: ubuntu2004 HeadNode: InstanceType: m6g.large Networking: ElasticIp: true SubnetId: subnet-035be95eeaa091603 Ssh: KeyName: sandbox-key LocalStorage: RootVolume: Size: 50 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CustomActions: OnNodeConfigured: Script: s3://blog-parallelcluster-postinstall/postinstall.sh Iam: S3Access: - BucketName: blog-parallelcluster-postinstall EnableWriteAccess: False AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore Scheduling: Scheduler: slurm SlurmQueues: - Name: cpu-spot ComputeResources: - Name: c6g8xlarge InstanceType: c6g.8xlarge MinCount: 0 MaxCount: 20 ComputeSettings: LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT Networking: SubnetIds: - subnet-035be95eeaa091603 PlacementGroup: Enabled: true CustomActions: OnNodeConfigured: Script: s3://blog-parallelcluster-postinstall/postinstall.sh Iam: S3Access: - BucketName: blog-parallelcluster-postinstall EnableWriteAccess: False AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - Name: high-cpu-spot ComputeResources: - Name: c6g16xlarge InstanceType: c6g.16xlarge MinCount: 0 MaxCount: 10 ComputeSettings: LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT Networking: SubnetIds: - subnet-035be95eeaa091603 PlacementGroup: Enabled: true CustomActions: OnNodeConfigured: Script: s3://blog-parallelcluster-postinstall/postinstall.sh Iam: S3Access: - BucketName: blog-parallelcluster-postinstall EnableWriteAccess: False AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
上記コンフィグからクラスターを作成し、エラーなく完了しました。
pcluster create-cluster --cluster-name sample-cluster --region ap-northeast-1 --cluster-configuration openfoam.yml
結果確認
IAMポリシー
ヘッドノードが作成されましたので、ヘッドノードのIAMロールを確認します。IAMロールの中にS3Accessのポリシーがありました。
内容を確認するとResource`にはS3バケット名だけ指定していたS3バケット名がARN表記に置き換わり、正しい書式でIAMポリシーが作成されていました。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::blog-parallelcluster-postinstall", "arn:aws:s3:::blog-parallelcluster-postinstall/*" ], "Effect": "Allow", "Sid": "S3Read" } ] }
カスタムブートストラップの動作
postinstall.shではpython3.8のインストールしています。ヘッドノードの/var/log/cfn-init-cmd.log
から実行時のログを確認します。最初からPython3.8がインストールされていましたが、動作していることは確認できたのでヨシとします。
2021-09-18 01:07:47,474 P1094 [INFO] ============================================================ 2021-09-18 01:07:47,474 P1094 [INFO] Command runpostinstall 2021-09-18 01:08:03,190 P1094 [INFO] -----------------------Command Output----------------------- 2021-09-18 01:08:03,190 P1094 [INFO] Get:1 http://ap-northeast-1a.clouds.ports.ubuntu.com/ubuntu-ports focal InRelease [265 kB] 2021-09-18 01:08:03,190 P1094 [INFO] Get:2 https://fsx-lustre-client-repo.s3.amazonaws.com/ubuntu focal InRelease [3274 B] 2021-09-18 01:08:03,190 P1094 [INFO] Get:3 http://ports.ubuntu.com/ubuntu-ports focal-security InRelease [114 kB] 2021-09-18 01:08:03,190 P1094 [INFO] Get:4 https://fsx-lustre-client-repo.s3.amazonaws.com/ubuntu focal/main arm64 Packages [9563 B] 2021-09-18 01:08:03,190 P1094 [INFO] Get:5 http://ap-northeast-1a.clouds.ports.ubuntu.com/ubuntu-ports focal-updates InRelease [114 kB] ...snip... 2021-09-18 01:08:03,191 P1094 [INFO] Get:50 http://ap-northeast-1a.clouds.ports.ubuntu.com/ubuntu-ports focal-backports/multiverse arm64 c-n-f Metadata [116 B] 2021-09-18 01:08:03,191 P1094 [INFO] Fetched 19.9 MB in 5s (3674 kB/s) 2021-09-18 01:08:03,191 P1094 [INFO] Reading package lists... 2021-09-18 01:08:03,191 P1094 [INFO] Reading package lists... 2021-09-18 01:08:03,191 P1094 [INFO] Building dependency tree... 2021-09-18 01:08:03,191 P1094 [INFO] Reading state information... 2021-09-18 01:08:03,191 P1094 [INFO] python3.8 is already the newest version (3.8.10-0ubuntu1~20.04). 2021-09-18 01:08:03,191 P1094 [INFO] python3.8 set to manually installed. 2021-09-18 01:08:03,191 P1094 [INFO] 0 upgraded, 0 newly installed, 0 to remove and 33 not upgraded.
おわりに
S3バケットと、postinstall.shの組み合わせコンピュートノードのカスタムブートストラップ(アプリケーションのインストールや、設定)を実現していました。ParallelCluster v3からはカスタムAMIがサポートされているため、もしかしたらアプリケーション、設定を焼き込んだAMIを作って運用するのが主流になるのかもしれません。まだ検証できていないため追って確認していきます。また、v2の基本であるカスタムブートストラップの動作にフォーカスして改めて検証したいと思います。